/*
 * @Description: 防抖和节流
 * @Version: V1.0.0
 * @Autor: CHY
 * @Date: 2022-04-26 20:08:50
 * @LastEditors: CHY
 * @LastEditTime: 2022-04-26 20:15:46
 */

/* 函数防抖是指在事件被触发n秒后再执行回调，如果在这n秒内事件又被触发, 则重新计时。这
 *可以使用在一些点击请求的事件上,避免因为用户的多次点击向后端发送多次请求。 
 *防抖最后一次实现
*/

/**
 * @description:函数防抖的实现
 * @param {*回调函数} fn
 * @param {*等待时间} wait
 * @return {*}
 * @author: CHY
 */
function debounce(fn, wait) {
    let timer = null;

    return function () {
        let context = this,
            args = arguments;

        // 如果此时存在定时器的话，则取消之前的定时器重新记时
        if (timer) {
            clearTimeout(timer);
            timer = null;
        }

        // 设置定时器，使事件间隔指定事件后执行
        timer = setTimeout(() => {
            fn.apply(context, args);
        }, wait);
    };
}

/* 
 *函数防抖是指在事件被触发n秒后再执行回调，如果在这n秒内事件又被触发,则重新计时。这
 *可以使用在一些点击请求的事件上,避免因为用户的多次点击向后端发送多次请求。 
 *按一定时间触发一次
*/

/**
 * @description: 函数节流的实现;
 * @param {*回调函数} fn
 * @param {*好久触发一次的时间} delay
 * @return {*}
 * @author: CHY
 */
function throttle(fn, delay) {
    let curTime = Date.now();

    return function () {
        let context = this,
            args = arguments,
            nowTime = Date.now();

        // 如果两次时间间隔超过了指定时间，则执行函数。
        if (nowTime - curTime >= delay) {
            curTime = Date.now();
            return fn.apply(context, args);
        }
    };
}
